/*
 * 组件注释
 * @Author: machinist_wq
 * @Date: 2022-07-01 11:13:34
 * @LastEditors: machinist_wq
 * @LastEditTime: 2022-11-04 21:14:03
 * @Description: 全局唯一的axios输出
 * 人生无常！大肠包小肠......
 */
"use strict";
import axios, { AxiosError, AxiosRequestConfig, AxiosResponse, Method } from "axios";
import { notification, message } from "antd";
// import { history } from "umi";
import { createHashHistory } from 'history';
import Cookies from "js-cookie";

message.config({ maxCount: 1, duration: 2 });

const isProduction = process.env.NODE_ENV === "production";

// 注意是hash 还是browser路由
const history = createHashHistory();
const codeMessage: { [key: string]: string } = {
  "202": "一个请求已经进入后台排队（异步任务）。",
  "204": "删除数据成功。",
  "400": "发出的请求有错误，服务器没有进行新建或修改数据的操作。",
  // "401": "用户没有权限（令牌、用户名、密码错误）。",
  "403": "用户得到授权，但是访问是被禁止的。",
  "404": "发出的请求针对的是不存在的记录，服务器没有进行操作。",
  "406": "请求的格式不可得。",
  "410": "请求的资源被永久删除，且不会再得到的。",
  "422": "当创建一个对象时，发生一个验证错误。",
  "500": "服务器发生错误，请检查服务器。",
  "502": "网关错误。",
  "503": "服务不可用，服务器暂时过载或维护。",
  "504": "网关超时。",
};

// 设置axios的返回拦截 报错处理
axios.interceptors.response.use(
  (response: AxiosResponse) => response,
  (error: AxiosError) => {
    let { status, data, config } = error.response as AxiosResponse;
    // 本地环境401不退出
    if (isProduction && status === 401) {
      message.info("请重新登录！");
      history.push({ pathname: "/login" });
    }
    // 本地环境接口报错提示
    if (!isProduction && String(status) in codeMessage) {
      notification.error({
        message: `请求错误 ${status}: ${config.url}`,
        description: codeMessage[String(status)],
        // 不默认关闭
        duration: 0,
      });
    }
    if (error.message.includes("timeout")) {
      message.warning("系统接口请求超时");
    } // 判断请求异常信息中是否含有超时timeout字符串
    return Promise.reject(data); // reject这个错误信息
  }
);

export default async function request(
  url: string,
  params: {} = {},
  method: Method = "get",
  URLMount: boolean = false
) {
  try {
    let token = Cookies.get("Authorization");
    if (token) {
      axios.defaults.headers.common["Authorization"] = JSON.parse(token);
    }
    // axios.defaults.headers.common["Cookie"] = '';
  } catch (e) {
    console.error(e);
  }
  const options: AxiosRequestConfig = {
    // `url` 是用于请求的服务器 URL
    url: url,
    // `method` 是创建请求时使用的方法 get 或者 post 是小写
    method: method,
    // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
    // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
    // baseURL: baseURL.baseURL,
    headers: {
      "Content-Type": "application/json; charset=UTF-8",
    },
    timeout: 10000,
  };

  if (method === "post" && !URLMount) {
    options.data = params;
  } else {
    options.params = { ...params };
  }
  try {
    let response = await axios(options as AxiosRequestConfig);
    const data = response.data;
    if (data.status !== 1) data.message && message.error(data.message);
    return data;
  } catch (error: any) {
    return error;
  }
}
window.request = request;
